# coding=utf-8

import web
from web.utils import storage, memoize

import settings
import utils
import redirect
from define import travel_type_key, depart_by_alias

import models
from controllers.projects import models as proj_models
from controllers.users import auth_subscribe

render = settings.FRONT_RENDER

class Redirect(object):
    """
    特惠信息订购转向
    """
    def GET(self, fid):
        # 读取特惠信息
        fid = utils.intval(fid)
        if fid:
            d = models.get_discount_redirect(fid)
            if d:
                return render.discounts.redirect(
                        d.spread_url % {'url': d.url}
                        , d.partner_name
                        , d.domain)
        # 参数错误或记录不存在，返回上一页
        return redirect.referer()

class RSS(object):
    """
    最新一期特惠信息的RSS输出
    """
    def GET(self):
        import random
        import PyRSS2Gen
        # 获取编码
        encoding = web.input().get('encoding', 'GBK')
        # 获取最新的特惠信息
        last_top10 = models.get_last_TOP10(include_content = True)
        if last_top10:
            last_top10 = last_top10.pop(0)
            # 创建rss对象
            rss = PyRSS2Gen.RSS2(
                    title = '寻宝图旅游特惠情报',
                    link = 'http://xunbaotu.com/',
                    description = '寻宝图是一个旅游特惠情报网站。通过对互联网上来自预订网站、酒店官网、航空公司官网特惠信息的追踪与筛选，寻宝图为旅行者推荐性价比最高的特惠折扣信息。',

                    lastBuildDate = utils.int2date(last_top10.date),
                    items = []
                )
            for item in last_top10.lst:
                # 生成一个签名
                sign = utils.sign_discount(item)
                rss.items.append(PyRSS2Gen.RSSItem(
                        title = item.title,
                        link = 'http://xunbaotu.com/discounts/%s?source=rss&id=%s' % (item.id, sign, ),
                        description = item.content,
                        guid = PyRSS2Gen.Guid('http://xunbaotu.com/discounts/%s' % item.id),
                        pubDate = utils.int2date(last_top10.date),
                        author = '寻宝图 xunbaotu.com',
                    ))

            return rss.to_xml(encoding=encoding)

        return 'None'


class Index(object):
    """
    特惠信息首页
    """
    def GET(self, alias = None):
        # 所有有效的（未过期）特惠信息
        all_valids = None
        # 将别名转换为对应的内码
        travel_type, depart, title, lightning, directing = self.transfer_alias(alias)
        # 获取日期
        date = utils.intval(utils.request('date'))
        if lightning:
            last_top10 = memoize(models.get_discounts_lightning, 300, False)()
        elif directing:
            last_top10 = memoize(models.get_discounts_directing, 300, False)()
        else:
            # 获取给定类型的TOP10
            last_top10 = memoize(models.get_last_TOP10, 300, False)(1
                    , travel_type
                    , date
                    , depart
                    , False)
            # 往期所有有效的未过期的特惠信息
            all_valids = memoize(models.get_discounts_valid_without_top10, 300, False)()

        # 渲染页面
        return render.discounts.list(
                  last_top10 and last_top10.pop(0) or None
                , all_valids
                #, last_top10 and last_top10.pop(0) or None
                , last_top10
                , alias
                , web.ctx.path
                , title)

    def transfer_alias(self, alias):
        """
        转换别名
        """
        # 项目类型
        travel_type = 0
        # 出发地
        depart = 0
        # 闪电特惠
        lightning = False
        # 直销特惠
        directing = False
        if alias:
            if utils.cmp_i(alias, 'lightning') == 0:
                lightning = True
            elif utils.cmp_i(alias, 'directing') == 0:
                directing = True
            elif '-' in alias:
                # 分割这个参数
                alias = alias.split('-')
                # 查找对应的内码值
                # 出发城市
                depart = depart_id_by_alias(alias[0])
                # 项目类型
                travel_type = travel_type_key(alias[1])
            else:
                # 没有组合参数的情况
                # 分别查找，找的到就着数
                travel_type = travel_type_key(alias)
                # 如果项目类型找到了
                # 就没有必须再找出发城市了
                if not travel_type:
                    depart = depart_by_alias(alias)

        title = None
        if travel_type:
            title = {
                        '1': ' - 酒店',
                        '3': ' - 航班',
                        '2': ' - 线路',
                    }[travel_type]
        elif depart:
            title = {
                        10: ' - 北京出发',
                        21: ' - 上海出发',
                        992: ' - 广州出发',
                        23: ' - 重庆出发',
                        65535: ' - 其他',
                    }[depart[0]]
        elif lightning:
            title = '闪电特惠'
        elif directing:
            title = '直销特惠'

        return travel_type, (isinstance(depart, tuple) and (depart[3] or depart[0]) or depart), title, lightning, directing

class Detail(object):
    """
    特惠信息详情页
    """
    def GET(self, id):
        if self.allow_direct_view(id):
            return self.render(id = id)
        else:
            return auth_subscribe(self.render)(self, id = id)

    def render(self, subscribed = True, *args, **kw):
        """
        渲染特惠详页
        @subscribed as Boolean, 这里表示用户是否已完成订阅
        """
        id = utils.intval(kw.pop('id'))
        if id <= 0:
            # 参数无效
            # 跳转回首页
            raise web.seeother('/')

        # 读取记录
        post = models.get_discount(id)
        # 没有读取到记录，跳转回首页
        if not post:
            raise web.seeother('/')

        partner = None
        if post.partner_id:
            # 获取合作商家信息
            partner = proj_models.Partner.get_partner_by_id(post.partner_id)

        # 过期提示
        expire = None
        # 获取过期提示
        if utils.date_is_expire(post.expire):
            # 已经过期
            # 判断是否是最新一期中的特惠信息超时
            # 获取最新一期的特惠信息的id列表
            ids = models.get_last_TOP10_discount_ids()
            if str(id) in ids:
                # 当期特惠信息中的过期提示
                expire = u'由于此次限时促销抢购人数过多，该特惠已提前结束或不适用。<br /><a href="/subscribe">立即订阅</a>我们每周出版的 <a href="/discounts">特惠评测精选</a>，将不再错过你感兴趣的特惠情报。'
            else:
                # 往期特惠信息中的过期提示
                expire = u'该特惠或已过期或被抢订一空。请查看最新出版的 <a href="/discounts">特惠评测精选</a>。'


        return render.discounts.detail(post
                , partner
                , expire
                , utils.sign_discount(post)
                , subscribed)

    def allow_direct_view(self, id):
        """
        判定当前请求是否需要先订阅才能浏览
        满足以下2种条件的可以不用订阅
        1、来自推广站点的
        2、来自订阅的
        """
        if utils.request_from_spread():
            # 来自推广站点
            # 允许直接浏览
            return True
        elif self.sign_equals(id):
            # 签名一致
            # 允许直接浏览
            return True
        elif web.ctx.user.is_bot:
            # 来访用户是机器人
            # 允许直接浏览
            return True
        else:
            # 其他任何条件都不允许浏览了
            return False

    def sign_equals(self, id):
        """
        签名是否一致
        """
        return utils.cmp_i(
                    utils.sign_discount(storage(id = id)), 
                    web.input().get('id', '')
                ) == 0
